import asyncio
import logging
from random import randint

from aiogram import Bot
from sqlalchemy.ext.asyncio import AsyncSession

from src.application.proxy.dto.proxy import ProxyDTO
from src.application.proxy.enums import ProxyStatus
from src.application.proxy.service import ProxyService
from src.config import Settings
from src.infrastructure.db.models import Proxy
from src.infrastructure.proxy_checker import get_proxy_status
from src.presentation.tg_bot.services.tg_helpers import broadcast
from src.presentation.tg_bot.worker.exception_handler import exception_handler

logger = logging.getLogger(__name__)


@exception_handler
async def check_proxy(
    ctx,
    sem: asyncio.Semaphore,
    proxy: ProxyDTO,
) -> None:
    bot: Bot = ctx["bot"]
    config: Settings = ctx["config"]
    proxy_service: ProxyService = ctx["proxy_service"]

    async with sem:
        await asyncio.sleep(randint(1, 4))
        logger.info(
            f"Проверяю прокси {proxy.login}:{proxy.password}@{proxy.server.ip_address}:{proxy.port_https} с сервера №{proxy.server_id}"
        )
        # TODO Добавить получение сервера прокси
        proxy_status, error_msg = await get_proxy_status(proxy)
        # TODO Добавить юзкейс по обновлению статуса
        if error_msg:
            if proxy.status != ProxyStatus.sold:
                status = ProxyStatus.invalid
            await broadcast(
                bot,
                config.tg_bot.admin_ids,
                error_msg,
            )
        else:
            if proxy.status != ProxyStatus.sold:
                status = ProxyStatus.available

        await proxy_service.update_proxy_status(proxy.id, status)
